最后更新时间:2020年12月18日
三维数据加载方法
MapGIS Mobile for Android支持多种三维数据的展示,包括离线的三维矢量、地形、引用二维地图,以及在线的IGServer二维地图服务、三维服务、OGC服务、第三方通用地图服务等。接下来讲解各种数据的具体加载方法。
(1)实例化三维图层对象,即各类数据图层:三维矢量图层(VectorLayer3D)、地形图层(TerrainLayer3D)、模型图层(ModelCacheLayer3D)、服务图层(ServerLayer3D)、二维引用地图(MapRefLayer)等,然后设置必要的信息:数据驱动类型、URL、图层参考系;
(2)通过场景Scene对象的addLayer()、insertLayer()接口加载各类图层对象;
(3)通过场景视图SceneView对象调用setSceneAsync()接口设置加载场景数据。
离线矢量数据 Sample详情
支持移动端加载shp格式的离线矢量数据,在准备好数据之后,需拷贝到移动设备的存储目录中。接下来重点讲解离线矢量数据的加载方法,其他数据加载方法类似。
1
在xml布局文件中添加SceneView视图控件之后,在java程序代码中实例化其对象。
SceneView sceneView = findViewById(R.id.sceneView);
2
加载离线矢量数据,构造VectorLayer3D图层对象,根据数据具体情况设置驱动类型、URL、图层参考系信息。
//创建矢量图层对象 VectorLayer3D mVectorLayer3D=new VectorLayer3D(); //1-设置数据驱动类型 mVectorLayer3D.setDriverType(DriverType.Driver_Type_OGR); //用于离线矢量数据的读取 //2-设置图层URL String dataPath= android.os.Environment.getExternalStorageDirectory().getPath()+"/MapGISSample/Scene/haiyang/haiyang.shp"; //获取数据路径 mVectorLayer3D.setURL(dataPath); //设置URL //3-设置图层参考系 mVectorLayer3D.setSRSByString(SRSType.SRS_Type_Global_MERCATOR); //WGS84,WEB墨卡托
重要说明:不同的三维数据需创建不同的图层对象,但都需要设置以下三部分信息。
(1)设置数据驱动类型-setDriverType():根据数据类型设置不同的驱动类型,作用是便于数据的读取、处理。各种驱动类型的字段由DriverType类提供。
(2)设置图层URL-setURL():设置数据URL,在线数据的URL、离线数据的本地文件路径。
(3)设置图层参考系-setSRSByString():根据数据的真实空间参考系设置对应的参数。
下方表格展示了MapGIS Mobile支持的各种三维场景数据类型,以及采用的图层对象、对应的数据驱动类型。
数据类型 | 图层对象类型 | 数据驱动类型 | |
---|---|---|---|
离线 | 矢量 | VectorLayer3D | DriverType.Driver_Type_OGR 用于离线矢量数据的读取 |
地形 | TerrainLayer3D | DriverType.Driver_Type_GDAL 用于离线栅格数据的读取 |
|
影像 | ServerLayer3D | DriverType.Driver_Type_GDAL 用于离线栅格数据的读取 |
|
模型 | ModelCacheLayer3D | DriverType.Driver_Type_Model_MapGIS_OP MapGIS倾斜摄影数据驱动; DriverType.Driver_Type_Model_MapGIS_M3D MapGIS M3D缓存数据驱动 |
|
在线 | MapGIS - 二维矢量、瓦片地图服务 | ServerLayer3D | DriverType.Driver_Type_MapGIS_Map MapGIS地图服务驱动 |
MapGIS - 三维场景服务 | DriverType.Driver_Type_MapGIS_3D MapGIS三维服务驱动 |
||
OGC - WMS | DriverType.Driver_Type_WMS OGC WMS服务驱动 |
||
OGC - WFS | DriverType.Driver_Type_WFS OGC WFS服务驱动 |
||
TMS | DriverType.Driver_Type_TMS TMS服务驱动 |
||
第三方 - 天地图、Google地图服务等 | DriverType.Driver_Type_XYZ 标准Web墨卡托地图服务驱动.如Google、百度等 |
空间参考系由SRSType类提供,目前只支持以下两种。
字段 | 说明 |
---|---|
SRSType.SRS_Type_Global | 全球,WGS84,经纬度 |
SRSType.SRS_Type_Global_MERCATOR | 全球,WGS84,WEB墨卡托 |
3
三维场景图层构造完成后,即可构造三维场景对象,然后为其添加图层。
//创建三维场景Scene(全局变量) Scene mScene = new Scene(); //为Scene添加图层 mScene.addLayer(mVectorLayer3D);
4
调用SceneView的setSceneAsync接口异步加载场景,并且提供回调函数,可以监听判断场景是否加载成功。
//为场景视图设置场景 sceneView.setSceneAsync(mScene, new SceneView.SceneFinishCallback() { @Override public void onDidFinish(boolean b) { if (b) { Toast.makeText(ShowVectorScene_Activity.this, "场景加载成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(ShowVectorScene_Activity.this, "场景加载失败", Toast.LENGTH_SHORT).show(); } } });
重要说明:场景加载整个流程中使用到的多个方法,都需要在MapGIS授权成功之后调用,否则不会起到任何作用。
离线三维地形 Sample详情
离线三维地形数据的加载方法和离线矢量数据类似,区别只在于三维图层的构建不一样。
//构建三维地形图层对象 TerrainLayer3D terrainLayer3D = new TerrainLayer3D(); //设置名称 terrainLayer3D.setName("三维地形"); //为图层设置驱动类型(GDAL数据驱动.用于离线栅格数据的读取) terrainLayer3D.setDriverType(DriverType.Driver_Type_GDAL); //设置URL:加载tif格式的地形数据 terrainLayer3D.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/tif/mt_everest_90m.tif"); //tif格式的地形数据无需设置空间参考系
离线三维影像 Sample详情
准备好tif格式影像数据后使用如下方法加载。
//实例化三维服务图层对象 ServerLayer3D mTifLayer = new ServerLayer3D(); mTifLayer.setName("影像数据"); //为图层设置驱动类型(GDAL数据驱动.用于离线栅格数据的读取) mTifLayer.setDriverType(DriverType.Driver_Type_GDAL); //设置URL mTifLayer.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/Tif/world.tif"); //设置图层数据的空间参考系(全球,WGS84,经纬度) mTifLayer.setSRSByString(SRSType.SRS_Type_Global);
离线三维模型 Sample详情
以倾斜摄影模型数据加载为例,首先准备.osgb倾斜摄影原始数据,然后需要使用MapGIS桌面平台软件对原始模型处理生成.mcx模型缓存文件,完成后将原始数据和.mcx文件都拷贝至移动设备存储中,然后调用以下方法加载。
//实例化模型图层对象 ModelCacheLayer3D modelLayer = new ModelCacheLayer3D(); modelLayer.setName("离线三维模型"); //为图层设置驱动类型(MapGIS倾斜摄影数据驱动) modelLayer.setDriverType(DriverType.Driver_Type_Model_MapGIS_OP); //设置URL modelLayer.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/dayanta/dayanta.mcx"); //设置空间参考系(全球,WGS84,经纬度) modelLayer.setSRSByString(SRSType.SRS_Type_Global);
M3D离在线三维模型
以M3D三维模型缓存数据加载为例,先通过MapGIS桌面平台软件对三维模型处理生成M3D标准的三维模型缓存数据,完成后将缓存数据(包括.m3d缓存数据文件与.mcj配置文件)拷贝至移动设备存储中,然后调用以下方法加载。
//实例化模型图层对象 ModelCacheLayer3D mM3DModelCacheLayer = new ModelCacheLayer3D(); //为图层设置驱动类型(MapGIS M3D模型缓存数据) mM3DModelCacheLayer.setDriverType(DriverType.Driver_Type_Model_MapGIS_M3D); //设置URL mM3DModelCacheLayer.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/models/m3d/jingguan/jingguan.mcj"); //加载模型图层 mScene.addLayer(mM3DModelCacheLayer);
以M3D三维模型缓存数据发布的三维服务为例,先通过MapGIS桌面平台软件对三维模型处理生成M3D标准的三维模型缓存数据,然后组织为一个三维地图文档.mapx,再通过IGServer服务器中发布的三维地图服务,最后调用以下方法加载。
//实例化三维服务图层对象 ServerLayer3D mM3DServerLayer3D = new ServerLayer3D(); //实例化地图服务(IGServer三维服务) MapServer mapServer = ServerLayer3D.createMapServer(ServerLayer3D.MAPSERVER_TYPE_IGSERVER_SCENE); //设置URL,添加三维数据 mapServer.setURL("http://develop.smaryun.com:6163/igs/rest/g3d/jingguan"); //设置地图服务 mM3DServerLayer3D.setMapServer(mapServer); //加载服务图层 mScene.addLayer(mM3DServerLayer3D);
IGServer二维矢量地图服务 Sample详情
三维场景中可以添加在IGServer服务器中发布的二维矢量地图服务。
//实例化地图服务(IGServer矢量数据服务) MapServer mServer = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_VECTOR); //设置URL,添加二维数据 mServer.setURL("http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector"); //实例化三维服务图层对象 ServerLayer3D mServerLayer3D = new ServerLayer3D(); mServerLayer3D.setMapServer(mServer); //设置地图服务 mServerLayer3D.setName("IGServer服务"); //设置驱动类型(MapGIS三维服务驱动) mServerLayer3D.setDriverType(DriverType.Driver_Type_MapGIS_Map); //设置空间参考系 mServerLayer3D.setSRSByString(SRSType.SRS_Type_Global); //经纬度
IGServer二维瓦片地图服务 Sample详情
三维场景中可以添加在IGServer服务器中发布的二维瓦片地图服务。
//实例化地图服务(IGServer瓦片服务) MapServer mServer = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_TILE); //设置URL mServer.setURL("http://develop.smaryun.com:6163/igs/rest/mrms/tile/JWWORLDTILE"); //实例化三维服务图层对象 ServerLayer3D mServerLayer3D = new ServerLayer3D(); //为服务图层设置地图服务 mServerLayer3D.setMapServer(mServer); mServerLayer3D.setName("IGServer瓦片数据"); //设置驱动类型(MapGIS地图服务驱动) mServerLayer3D.setDriverType(DriverType.Driver_Type_MapGIS_Map); //根据数据类型设置空间参考系类型 mServerLayer3D.setSRSByString(SRSType.SRS_Type_Global); //经纬度
IGServer三维场景服务 Sample详情
首先需在IGServer服务器中发布三维场景服务,然后获取其URL,再调用以下方法加载展示。
//实例化地图服务(IGServer三维服务) MapServer mServer = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_SCENE); //设置URL mServer.setURL("http://develop.smaryun.com:6163/igs/rest/g3d/WuHanJWScene"); //实例化三维服务图层对象 ServerLayer3D mServerLayer3D = new ServerLayer3D(); //为服务图层设置地图服务 mServerLayer3D.setMapServer(mServer); mServerLayer3D.setName("IGServer服务"); //设置驱动类型(MapGIS三维服务驱动) mServerLayer3D.setDriverType(DriverType.Driver_Type_MapGIS_3D); //根据数据类型设置空间参考系类型,必须要加 mServerLayer3D.setSRSByString(SRSType.SRS_Type_Global);//经纬度
在线WMS服务 Sample详情
支持OGC标准中的WMS服务,可以加载发布在IGServer服务器中的WMS地图服务。
//创建三维服务图层对象 ServerLayer3D mWmsServerLayer = new ServerLayer3D(); //设置驱动类型(OGC WMS服务驱动) mWmsServerLayer.setDriverType(DriverType.Driver_Type_WMS); //创建地图服务 MapServer mapServerWMS = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_OGC_WMS); //设置三维服务图层对象的地图服务 mWmsServerLayer.setMapServer(mapServerWMS); //设置三维服务图层的地图服务URL mWmsServerLayer.setURL("http://develop.smaryun.com:6163/igs/rest/ogc/layer/WorldJWVectLayer/WMSServer"); //根据数据类型设置空间参考系类型 mWmsServerLayer.setSRSByString(SRSType.SRS_Type_Global);//经纬度 //添加图层 mScene.addLayer(mWmsServerLayer);
在线WFS服务
支持OGC标准中的WFS服务,可以加载发布在IGServer服务器中的WFS地图服务。
mScene = new Scene(); //创建三维服务图层对象 WfsServerLayer3D = new ServerLayer3D(); WfsServerLayer3D.setName("wfs"); //设置驱动类型(OGC WFS服务驱动) WfsServerLayer3D.setDriverType(DriverType.Driver_Type_WFS); //创建地图服务 WfsServerLayer3D.setMapServer(ServerLayer3D.createMapServer(ServerLayer3D.MAPSERVER_TYPE_OGC_WFS)); //设置三维服务图层的地图服务URL WfsServerLayer3D.setURL("http://gisserver.tianditu.gov.cn/TDTService/wfs"); //通过子线程加载添加图层 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub if(WfsServerLayer3D.isValid()) { int count = WfsServerLayer3D.getLayerCount(); for (int i = 0; i < count; i++) { Log.e("WfsServerLayer3D", WfsServerLayer3D.getLayer(i).getName()); if (WfsServerLayer3D.getLayer(i).getName().equals("TDTService:BOUL")) { WfsServerLayer3D.getLayer(i).setState(LayerState.Visible); } } //添加图层 mScene.addLayer(WfsServerLayer3D); mSceneView.setSunLightingMode(SunLightingMode.NONE); mSceneView.setScene(mScene); } } }).start();
在线TMS服务 Sample详情
获取TMS服务地址之后采用如下方法加载。
//实例化三维服务图层对象 ServerLayer3D mTMSLayer3D = new ServerLayer3D(); mTMSLayer3D.setName("TMS三维数据"); //设置驱动类型(TMS服务驱动) mTMSLayer3D.setDriverType(DriverType.Driver_Type_TMS); //空间参考系类型 mTMSLayer3D.setSRSByString(SRSType.SRS_Type_Global); //设置URL mTMSLayer3D.setURL("http://readymap.org/readymap/tiles/1.0.0/7/");
在线Google地图服务 Sample详情
获取Google地图服务地址后使用以下方法加载。
//实例化三维服务图层对象 ServerLayer3D mGoogleLayer3D = new ServerLayer3D(); mGoogleLayer3D.setName("Google三维数据"); //设置驱动类型(标准Web墨卡托地图服务驱动.如Google、百度等) mGoogleLayer3D.setDriverType(DriverType.Driver_Type_XYZ); //设置空间参考系类型(全球,WGS84,WEB墨卡托) mGoogleLayer3D.setSRSByString(SRSType.SRS_Type_Global_MERCATOR); //设置URL mGoogleLayer3D.setURL("http://mt[0123].google.cn/vt/lyrs=s@106&gl=cn&x={x}&y={y}&z={z}&s=Gali");